import { asyncRoutes, constantRoutes } from '@/router'
import Layout from '@/layout'
import {getly} from "@/api/user";
// 筛选路由
// 匹配权限
function hasPermission(roles, route) {
  // 在路由上找的到 route.mate 和 route.mate.roles
  if (route.meta && route.meta.roles) {
    //这里要返回数组才可以 role =>array('admin');
    //return roles.some(role => route.meta.roles.includes(role))
    //这里只需要返回 字符串即可
    // console.log("roles",roles)

    if(route.meta.roles.indexOf(roles)>-1){
      return true;
    }else {
      return false;
    }

  } else {
    return true
  }
}

// 通过递归过滤异步路由表

export function filterAsyncRoutes(routes, roles) {
  // 装筛选出来的路由
  const res = []
  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })

  return res
}

const state = {
  routes: [],
  addRoutes: []
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes) // 将过滤的路由和国定的路由存起来
    //console.log(state.routes)
  }
}

// 筛选
// const actions = {
//   generateRoutes({ commit }, roles) {
//     return new Promise(resolve => {
//       let accessedRoutes
//       // 因为我不同角色有不同的路由，不需要全部显示，所以就直接赋值了，如果需要admin全部显示的话，可以看看下面getly的
//       getly(state.token).then(response => {
//
//         const { data } = response
//         //let arr_data = Array.from(data)
//         // let arr_data = JSON.parse( JSON.stringify( data ) )
//         // let arr_data = Array.prototype.slice.call(data)
//         let a = Object.values(data)
//         a.map(i=>{
//           i.component = Layout
//           i.meta = {
//             title:i.name,
//             icon:i.icon
//           }
//           i.children.map(j => {
//             j.meta = {
//               title: j.name
//             },
//             j.component =  () => import('@/views/table/index')
//           })
//         })
//         console.log('a',a)
//         const b =  asyncRoutes.concat(a)//将asyncRoutes+b合并数组
//         //accessedRoutes = filterAsyncRoutes(b, roles)
//
//         // console.log(accessedRoutes)
//         // // 路由是否为 admin, 有直接全部显示
//         if (roles.includes('admin')) {
//           //accessedRoutes = asyncRoutes || []
//           accessedRoutes = b
//         } else {
//           //过滤路由
//           accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
//         }
//         commit('SET_ROUTES', accessedRoutes)
//         resolve(accessedRoutes)
//
//
//       }).catch(error => {
//         console.log(error)
//       })
//
//
//     })
//   }
// }

// 筛选
const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes
      // 因为我不同角色有不同的路由，不需要全部显示，所以就直接赋值了，如果需要admin全部显示的话，可以看看下面的
      accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      // // 路由是否为 admin, 有直接全部显示
      if (roles.includes('admin')) {
        accessedRoutes = asyncRoutes || []
      } else {
        // 过滤路由
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}


export default {
  namespaced: true,
  state,
  mutations,
  actions
}

